package checker;

import util.AST.Program;
import util.AST.Command.FunctionBody;
import util.AST.Command.FunctionDeclaration;
import util.AST.Command.VariableDeclaration;
import util.AST.Expression.BinaryExpression;
import util.AST.Expression.BooleanUnaryExpression;
import util.AST.Expression.IdentifierUnaryExpression;
import util.AST.Expression.NumberUnaryExpression;
import util.AST.RHS.CallStatementRHS;
import util.AST.RHS.ExpressionRHS;
import util.AST.Statement.AssignStatement;
import util.AST.Statement.BreakStatement;
import util.AST.Statement.CallStatement;
import util.AST.Statement.ContinueStatement;
import util.AST.Statement.IfElseStatement;
import util.AST.Statement.PrintlnStatement;
import util.AST.Statement.ReturnStatement;
import util.AST.Statement.WhileStatement;
import util.AST.Terminal.BooleanValue;
import util.AST.Terminal.Identifier;
import util.AST.Terminal.NumberValue;
import util.AST.Terminal.Operator;
import util.AST.Terminal.Type;

public interface Visitor {

	public Object visitProgram(Program p, Object o) throws SemanticException;
	public Object visitFunctionBody(FunctionBody fb, Object o) throws SemanticException;
	public Object visitFunctionDeclaration(FunctionDeclaration fd, Object o) throws SemanticException;
	public Object visitVariableDeclaration(VariableDeclaration vd, Object o) throws SemanticException;
	public Object visitBinaryExpression(BinaryExpression be, Object o) throws SemanticException;
	public Object visitBooleanUnaryExpression(BooleanUnaryExpression bue, Object o) throws SemanticException;
	public Object visitIdentifierUnaryExpression(IdentifierUnaryExpression iue, Object o) throws SemanticException;
	public Object visitNumberUnaryExpression(NumberUnaryExpression nue, Object o) throws SemanticException;
	public Object visitCallStatementRHS(CallStatementRHS csrhs, Object o) throws SemanticException;
	public Object visitExpressionRHS(ExpressionRHS erhs, Object o) throws SemanticException;
	public Object visitAssignStatement(AssignStatement as, Object o) throws SemanticException;
	public Object visitBreakStatement(BreakStatement bs, Object o) throws SemanticException;
	public Object visitCallStatement(CallStatement cs, Object o) throws SemanticException;
	public Object visitContinueStatement(ContinueStatement cs, Object o) throws SemanticException;
	public Object visitIfElseStatement(IfElseStatement ies, Object o) throws SemanticException;
	public Object visitPrintlnStatement(PrintlnStatement ps, Object o) throws SemanticException;
	public Object visitReturn(ReturnStatement rs, Object o) throws SemanticException;
	public Object visitWhileStatement(WhileStatement ws, Object o) throws SemanticException;
	public Object visitBooleanValue(BooleanValue bv, Object o) throws SemanticException;
	public Object visitIdentifier(Identifier i, Object o) throws SemanticException;
	public Object visitNumberValue(NumberValue nv, Object o) throws SemanticException;
	public Object visitOperator(Operator op, Object o) throws SemanticException;
	public Object visitType(Type t, Object o) throws SemanticException;
}
